package com.ce.sys.login.action;


import com.ce.framework.constants.WebConstants;
import com.ce.framework.datamaintain.action.DataMaintainAction;
import com.ce.framework.datamaintain.logic.IBaseLogic;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.*;
import com.ce.sys.login.model.User;
import com.ce.sys.person.dao.po.SysPerson;
import com.ce.util.DbUtil;
import com.ce.util.OrgUtil;
import com.ce.util.RegeditUtil;
import com.ce.util.SessionUtil;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.List;


/**
 * 嫦娥软件有限公司 版权所有 2013 
 * 创建人： andy 
 * 创建时间： 2013-10-2 上午09:27:33 
 * 功能描述：用户用户登录及注销的操作类
 * ================================== 
 * 修改历史 修改人 修改时间 修改位置（函数名）
 * 
 * ==================================
 */
public class LoginAction extends DataMaintainAction
{
    private static final long serialVersionUID = 1L;

    private String username; // 用户名
    private String password; // 密码
    private String checkNum; // 验证码

    private IBaseLogic baselogic;

    /**
     * 开发人： andy 开发时间： 2013-10-2 上午09:47:56 
     * 功能描述： 用户登录 方法的参数和返回值
     * 
     * @return
     * @throws AppException
     *             String ================================== 
     *             修改历史 修改人 修改时间
     *             修改原因及内容
     * 
     *             ==================================
     */
    public String login() throws AppException {
		
		if (RegeditUtil.getRegeditBoolValue("SYSTEM_LOGIN_NUMCHECK")) {
		    // 检验验证码
		    if (!SessionUtil.getAttr("rand").equals(checkNum)) {
			return super.returnInfoForJS(false, "checkNumError");
		    }
		}
		List<?> userList = null;
		try {
			userList = baselogic.searchByHql("from SysPerson po where (po.vcNumber='"+StringUtil.filterSqlContent(username.trim())+"' or po.vcLogName='"+StringUtil.filterSqlContent(username.trim())+"') "
					+" and po.vcStatus >0 and po.vcDelFlag = 0");
		} catch (Exception e) {
			LogUtil.logError(e);
		}
		User user = null;
		if (userList != null && userList.size() > 0) {
		    // 系统登陆用户验证成功
		    SysPerson person = null;
		    for(int i=0;i<userList.size();i++){
			    person = (SysPerson) userList.get(0);
		    	if(StringUtil.isNotBlank(person.getVcPwd())){
		    		if(person.getVcPwd().length()==32){//如果密码是加密后的MD5码，则进行转码后匹配
		    			if(person.getVcPwd().equals(MD5.toMd5String(password))){
		    				user = new User(person);
		    			}
		    		}
		    		else{//否则使用明文匹配
		    			if(person.getVcPwd().equals(password)){
		    				user = new User(person);
		    			}
		    		}
		    	}
		    }
		    //如果是段级以上单位，判断人员所属单位，如不是本单位人员，则不允许登录
        	if(user!=null&&!RegeditUtil.getRegeditBoolValue("SYSTEM_ALL_PERSON_LOGIN")&&Integer.parseInt(OrgUtil.getRootOrgFlag())<5&&!OrgUtil.getRootOrgId().equals(user.getOrgManProId())){
        		return super.returnInfoForJS(false, "您不是本单位人员！");
        	}
        	SessionUtil.setAttribute(User.USER_SESSION_ID, user);
		} else if (User.checkSuperUser(this.username.trim(), this.username.trim(),
			this.password.trim())) {
		    // 超管用户验证成功
		    user = User.setSuperUserInfo(OrgUtil.getRootOrgId());
		}
		if(user!=null){
			//将每页显示行数的信息写入SESSION中
			getRequest().getSession().setAttribute(WebConstants.SEARCH_PAGE_SIZE_FLDNAME, user.getRegeditValue(WebConstants.ROWS_PER_PAGE));
		    //生成SSO单点登录ID，写入数据库，同时写入COOKIE
		    String ssoid = Uuid.getUuid();
		    String sql = "insert into SYS_T_SESSION$INF(SESSION_ID,SESSION_VALUE) values(?,?)";
			DbUtil.executeSqlUpdate(sql ,new Object[]{ssoid,user.getVcId()});
			Cookie ck = new Cookie("SSO_ID",ssoid);
			ck.setPath("/");
			getResponse().addCookie(ck);
		    SessionUtil.setAttribute("SSO_ID",ssoid);
//		    return NONE;
	    	String toUrl = (String) getRequest().getSession().getAttribute("loginToPage");
	    	getRequest().getSession().removeAttribute("loginToPage");
	    	if(toUrl!=null&&toUrl.indexOf("goto=true")<0){
	    		toUrl = null;
	    	}
	    	if(StringUtil.isBlank(toUrl)){
	    		toUrl = this.getSystemFrameURL();
	    	}
		    return super.returnInfoForJS(true, toUrl);
		  
		}
		else{
			
		        return super.returnInfoForJS(false, "userError");
		}
    }

    /**
     * 开发人： andy 开发时间： 2013-10-9 下午02:50:54 
     * 功能描述：系统第一次运行时进行的表结构初始化操作 
     * 方法的参数和返回值
     * void 
     * ================================== 
     * 修改历史 修改人 修改时间 修改原因及内容
     * 
     * ==================================
     */
    public String initSystem() throws AppException {
	try {
		//初始化主工程数据
	    new DataBaseUpdateUtil().initSystem(this.getRequest().getContextPath());  //初始化主框架
	    RegeditUtil.clearValues();
	} catch (Exception e) {
	    return super.returnInfoForJS(false, "系统初始化失败！");
	}
	return super.returnInfoForJS(true, "初始化成功！");
    }

    /**
     * 开发人： andy 开发时间： 2013-10-9 下午02:55:36 
     * 功能描述：验证成功后，返回的系统框架主界面地址 
     * 方法的参数和返回值
     * 
     * @return String
     *  ================================== 
     *  修改历史 修改人 修改时间 修改原因及内容
     * 
     *  ==================================
     */
    @SuppressWarnings("deprecation")
    private String getSystemFrameURL() {
	String url = RegeditUtil
		.getRegeditStringValue(RegeditUtil.SYSTEM_FRAME_URI);
	if (StringUtil.isBlank(url)) {
	    url = "/sys/main/SysMain_enterMainFrame.action";
	}
	url = getRequest().getContextPath() + url;
	// 此处加入判断进入子系统框架界面的代码
	return url;
    }

    /**
     * 开发人： andy 开发时间： 2013-10-2 上午09:48:08 
     * 功能描述： 用户注销 方法的参数和返回值
     * 
     * @return
     * @throws AppException
     *             String ================================== 
     *             修改历史 修改人 修改时间
     *             修改原因及内容
     * 
     *             ==================================
     */
    @SuppressWarnings({ "deprecation", "unchecked" })
	public String loginOut() throws AppException {
		this.getRequest().getSession().removeAttribute(User.USER_SESSION_ID);// 清除session信息
		Enumeration<String> e = this.getRequest().getSession().getAttributeNames();
		while(e.hasMoreElements()){
			this.getRequest().getSession().removeAttribute(e.nextElement());
		}
		SessionUtil.delSessionId(getSsoid(getRequest()));
		SessionUtil.removeSession(getRequest().getSession());
		if (StringUtil.isNotBlank(this.getParameter("op"))) {
			return this.getParameter("op"); // 返回首页
		}
		else if (StringUtil.isNotBlank(RegeditUtil
				.getRegeditStringValue("LOGIN_PAGE"))) {
			return super.writeJavaScript("window.location.href='"
					+ RegeditUtil.getRegeditStringValue("LOGIN_PAGE") + "'");
		} else {
			return this.reLogin();
		}
	}
    
 

    private String getSsoid(HttpServletRequest request){
    	if(request.getCookies()!=null){
        	for(Cookie c:request.getCookies()){
        		if("SSO_ID".equals(c.getName())){//使用COOKIE中的UUID登录
        			return c.getValue();
        		}
        	}
    	}
    	return request.getParameter("SSO_ID");
    }

 

    public String reLogin() throws AppException {
    	//判断是第一次运行时进行初始化系统数据表
    	if(this.isInitSys())
			return "initSystem";
    	
	      return "loginPage"; // 返回登陆界面
    }
    
    /**
     * 开发人： andy
     * 开发时间： 2014-1-24上午10:49:04
     * 功能描述：判断是否进行系统初始化
     * 方法的参数和返回值
     * @return
     * boolean 
     */
    private boolean isInitSys(){
    	boolean flag = false;
    	String sql = "select count(*) from user_tables t where t.table_name='SYS_T_DBUPD$NEWWAY'";
		if(DbUtil.getFirstIntSqlQuery(sql)==0){
			flag = true;
		}
    	return flag;
    }

    public String getUsername() {
	return username;
    }

    public void setUsername(String username) {
	this.username = username;
    }

    public String getPassword() {
	return password;
    }

    public void setPassword(String password) {
	this.password = password;
    }

    public String getCheckNum() {
	return checkNum;
    }

    public void setCheckNum(String checkNum) {
	this.checkNum = checkNum;
    }

    public void setBaselogic(IBaseLogic baselogic) {
	this.baselogic = baselogic;
    }

}
